// 装饰器 可以装饰类  类的属性  类的原型上的方法


// experimentalDecorators  设置这个选项编辑器不报错

// babel 又要添加插件 才行  
@flag
class Animal{
  @readOnly PI = 3.14
  name = 'xxx'
  @before
  say() {
    console.log('你好')
  }
}

// 装饰类  接收类的构造函数
function flag(constructor) {
  console.log(constructor)
}
// 属性的装饰器
function readOnly(target, property, descriptor) {
  console.log(target) // 类的原型
  descriptor.writable = false
}
// 方法的装饰器
function before(target, property, descriptor) {
  // 
  // console.log(before)
  let old = descriptor.value
  descriptor.value = function () {
    console.log('before')
    old()
  }

}

let a = new Animal()
a.say()